﻿using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo02
{
    /*    编写一个程序，用以接收用户输入的两个浮点型的数值，一个值表示用户想要存放在银行账户中的余额，
     *    另一个值表示用户想要从银行账户中提取的金额。
    实现存取款功能，
    用户功能选择：1、存款，2、取款
    取款时：
    当用户想要提取的金额大于余额时，请手动抛出一个ArgumentOutOfRangeException 参数超出范围的异常，
    异常信息可以写“取款金额大于余额，请重新输入”
    ，如此以确保取款金额始终不大于当前余额。
    操作结束，打印输出余额是多少。
    最后再添加catch一般异常 Exception，使得数据类型转换的异常也能被捕获到。*/

    class Program2
    {
        static Account account = new Account("abc");
        static void Main(string[] args)
        {
            while (true)
            {
                m: Console.WriteLine("用户功能选择：1、存款，2、取款 3.退出");
                int choice;
                while (true)
                {
                    try
                    {
                        choice = int.Parse(Console.ReadLine());
                        if (choice < 1 || choice > 3)
                        {
                            Console.WriteLine("请重新输入");
                            continue;
                        }
                        break;
                    }
                    catch (Exception)
                    {
                        Console.WriteLine("请重新输入");
                    }
                }
                switch (choice)
                {
                    case 1:
                        Console.WriteLine("请输入存入的金额");
                        float save;
                        while (true)
                        {
                            try
                            {
                                save = float.Parse(Console.ReadLine());
                                break;
                            }
                            catch (Exception)
                            {
                                Console.WriteLine("输入错误，重新输入");
                            }
                        }
                        account.Save(save);
                        Console.WriteLine($"存入成功,账户余额{account.Balance}");
                        break;
                    case 2:
                        a: Console.WriteLine("请输入取出的金额");
                        float get;
                        while (true)
                        {
                            try
                            {
                                get = float.Parse(Console.ReadLine());
                                break;
                            }
                            catch (Exception)
                            {
                                Console.WriteLine("输入错误，重新输入");
                            }
                        }

                        try
                        {
                            account.Get(get);
                            Console.WriteLine($"取款成功,账户余额{account.Balance}");
                        }
                        catch (ArgumentOutOfRangeException a)
                        {
                            Console.WriteLine(a.Message);
                            Console.WriteLine($"账户余额为{account.Balance}");
                            Console.WriteLine("按e返回,其余继续取出");
                            string s = Console.ReadLine();
                            if (s == "e")
                            {
                                goto m;
                            }
                            goto a;
                        }
                        break;
                    case 3:
                        Process.GetCurrentProcess().Kill();
                        break;
                }
            }
        }

    }

    public class Account
    {
        private string _userName;
        private float _balance;

        public string UserName { get => _userName; set => _userName = value; }
        public float Balance { get => _balance; }

        public Account(string userName)
        {
            _userName = userName;
        }

        public override string ToString()
        {
            return $"Name:{this.UserName}";
        }

        public void Save(float saveMoney)
        {
            _balance += saveMoney;
        }

        public void Get(float getMoney)
        {
            if (getMoney > Balance) throw new ArgumentOutOfRangeException("取款金额大于余额，请重新输入");
            _balance -= getMoney;
        }
    }
}
